#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/file.h>
#include <sys/wait.h>



int main()
{
    //q其他程序替换的使用
    pid_t id = fork();
    if(id==0)
    {
        //execl ,以列表的形式传输，字符串列表，后面的和命令行写法一致
        //但是推荐写法最好是标准写法
        printf("child process id ::%d\n",getpid());    

        execlp("ls","-a",NULL);
        //会自动去环境变量去找这个程序
        
        char* const argv[] = {"ls","-a","-l",NULL};
        execv("/usr/bin/ls",argv);
        //数组传参
        
        //execvp
        //环境变量去找，同时数组传参

        printf("end\n");
    }
    else{
        pid_t rid = wait(NULL);
        if(rid>0)
        {
            printf("child success rid ::%d\n",rid);
        }
    }
    return 0;
}
//int main()
//{
//    pid_t id = fork();
//    if(id==0)
//    {
//        printf("pid %d,exec begin \n",getpid());
//        sleep(3); 
//        execl("/usr/bin/lssss","llll",NULL);//程序替换之后，后面就不再执行
//        //注意只有程序失败了才会执行后面的值，而这个返回值，也是失败了才返回，成功了，就是下一个程序，没有返回值一说了。
//        printf("execl end\n");
//    }
//    else{
//        pid_t rid = wait(NULL);
//        if(rid>0)
//        {
//            printf("child process ,rid is %d\n",rid);
//        }
//    }
//    return 0;
//}

//int main()
//{
//    
//
//   // execl("/usr/bin/ls","ll",NULL)i;//程序替换之后，后面就不再执行
//   // //在这个过程，不会创建进程，只是把要替换的那一部分读取到内存里面
//   // 进程控制块都没改变，进程id也没变，只是替换进程内容
//   //tmp execl("/usr/bin/top","top",NULL);
//   printf("PID:%d\n",getpid());
//    return 0;
//}
